// 当对象内仅有基本类型属性时，我们可以使用Object.assign实现对象的引用分离复制
obj1 = {
    a:1,
    b:2,
    x:'xxx'
}
// 引用赋值
// cpy = obj1

// Object.assign 直接用途是连接多个对象，可间接用于对象的一层分离复制
cpy = Object.assign({},obj1)

cpy.x = 'zzz'
console.log(obj1,cpy);


obj2 = {
    a:{name:'obj2'}
}

// 有引用类型时，则不能进行引用分离复制
cpy = Object.assign({},obj2)
cpy.a.name = 'cpy'
console.log(obj2, cpy);

obj3 = {
    a: { name: 'obj3' }
}


// 使用对象展开符，进行基本属性的分离引用复制。
let obj1 = {
    a:1,
    b:2,
    son:{c:2}
}
let obj2 = {
    ...obj1
}
obj1.a = 3
obj1.son.c = 3
console.log(obj2);

// deep clone可通过对象序列化再反序列化的方式，简单实现(不考虑循环引用，函数和原型的复制)，
cpy = JSON.parse(JSON.stringify(obj3))
cpy.a.name = 'cpy'
console.log(obj3, cpy);